package com.cabinet.base.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;

import com.cabinet.easy.util.JacksonJsonDateSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

/**
 * 实体基类，实体会继承这个基类
 * 
 * @author nibili 2015年9月29日
 * 
 */
@MappedSuperclass
@EntityListeners(value = { BaseEntityListener.class })
@DynamicInsert
@DynamicUpdate
public abstract class IdEntity implements Serializable {

	/** */
	private static final long serialVersionUID = -7412141076111713692L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(unique = true, nullable = false)
	private Long id;

	/** 数据添加时间 */
	private Date addTime;

	private boolean deleteStatus;

	/** 创建人. */
	private String createBy; //

	/** 最后修改时间. */
	private Date lastModifyTime; //

	/** 最后修改人. */
	private String lastModifyBy; //

	/** 实体版本 */
	@Version
	@Column(nullable = false, columnDefinition = "int default 0")
	private Long version = 0l; //

	/**
	 * get 实体版本
	 * 
	 * @return
	 * @author nibili 2015年12月24日
	 */
	public Long getVersion() {
		if (this.version == null) {
			this.version = 0l;
		}
		return version;
	}

	/**
	 * set 实体版本
	 * 
	 * @param version
	 * @author nibili 2015年12月24日
	 */
	public void setVersion(Long version) {
		this.version = version;
	}

	/**
	 * get 创建人.
	 * 
	 * @return
	 * @author nibili 2015年12月22日
	 */
	public String getCreateBy() {
		return createBy;
	}

	/**
	 * set 创建人.
	 * 
	 * @param createBy
	 * @author nibili 2015年12月22日
	 */
	public void setCreateBy(String createBy) {
		this.createBy = createBy;
	}

	/**
	 * get 最后修改时间.
	 * 
	 * @return
	 * @author nibili 2015年12月22日
	 */
	@JsonSerialize(using = JacksonJsonDateSerializer.class)
	public Date getLastModifyTime() {
		return lastModifyTime;
	}

	/**
	 * set 最后修改时间.
	 * 
	 * @param lastModifyTime
	 * @author nibili 2015年12月22日
	 */
	public void setLastModifyTime(Date lastModifyTime) {
		this.lastModifyTime = lastModifyTime;
	}

	/**
	 * get 最后修改人.
	 * 
	 * @return
	 * @author nibili 2015年12月22日
	 */
	public String getLastModifyBy() {
		return lastModifyBy;
	}

	/**
	 * set 最后修改人.
	 * 
	 * @param lastModifyBy
	 * @author nibili 2015年12月22日
	 */
	public void setLastModifyBy(String lastModifyBy) {
		this.lastModifyBy = lastModifyBy;
	}

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	@JsonSerialize(using = JacksonJsonDateSerializer.class)
	public Date getAddTime() {
		return this.addTime;
	}

	public void setAddTime(Date addTime) {
		this.addTime = addTime;
	}

	public boolean isDeleteStatus() {
		return this.deleteStatus;
	}

	public void setDeleteStatus(boolean deleteStatus) {
		this.deleteStatus = deleteStatus;
	}
}